<?php
/**
 * Hlib_Form基底クラス
 * @author admin
 */
require_once __DIR__ . '/Abstractor.php';
require_once __DIR__ . '/GeneralAttribute.php';
require_once '/../ZendPartial/ZendPartial.php';

/**
 * Hlib_Form基底クラス
 * @author admin
 * @link http://minder.minibird.jp/wikirin/index.php?PHP%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%8A%E3%83%BC%2Fhlib_Form
 */
class Hlib_Form extends Hlib_Form_Abstactor
{
	/***
	 * <form></form>fetch識別定数
	 */
	// FORM OPEN
	const FORM_START = 'FORM_START';
	// FORM CLOSE
	const FORM_END = 'FORM_END';

	/**共通属性 */
	public $GeneralAttibutes = NULL;
	/**送信先プログラムのURIを指定する*/
	public $action="";
	/**送信の際の転送方法（HTTPメソッド）を指定する*/
	public $method="";
	/**送信の際のデータ形式（MIMEタイプ）を指定する*/
	public  $enctype="";
	/**CGIプログラム等のデータの受け側で、受付可能な文字セットを指定する*/
	public  $accept_charset="";
	/**CGIプログラム等のデータの受け側で、処理可能なMIMEタイプを指定する*/
	public  $accept="";
	/**スクリプト言語などから参照できるよう名前を指定する*/
	public  $name="";
	/**フォーム送信の結果を表示するフレーム、またはウィンドウの名前を指定する*/
	public  $target="";

	/**入力コントローラ集*/
	protected $_inputControllers = array();

	/**
	 * コンストラクタ
	 */
	public function  __construct()
	{
		$TemplateDir = __DIR__;
		parent::__construct($TemplateDir);
		$this->GeneralAttibutes = new Hlib_Form_GeneralAttribute();
	}

	/**
	 * フェッチ
	 * (non-PHPdoc)
	 * @see ZendPartialController::fetch()
	 */
	public function fetch($StartEnd)
	{
		// <FORMタグ：ＯＰＥＮ｜ＣＬＯＳＥ判定
		if ($StartEnd == self::FORM_START) {
			$TemplateFileName = 'from_start.tpl';
		} else {
			return '</form>';
		}
		/**送信先プログラムのURIを指定する*/
		$this->view->action=$this->action;
		/**送信の際の転送方法（HTTPメソッド）を指定する*/
		$this->view->method=$this->method;
		/**送信の際のデータ形式（MIMEタイプ）を指定する*/
		$this->view->enctype=$this->enctype;
		/**CGIプログラム等のデータの受け側で、受付可能な文字セットを指定する*/
		$this->view->accept_charset=$this->accept_charset;
		/**CGIプログラム等のデータの受け側で、処理可能なMIMEタイプを指定する*/
		$this->view->accept=$this->accept;
		/**スクリプト言語などから参照できるよう名前を指定する*/
		$this->view->name=$this->name;
		/**フォーム送信の結果を表示するフレーム、またはウィンドウの名前を指定する*/
		$this->view->target=$this->target;
		/**一般属性設置 */
		$this->view->general_attribute = $this->GeneralAttibutes->fetch();
		
		$sHtml = parent::fetch($TemplateFileName);
		$sHtml = str_replace("\t", '', $sHtml);
		return $sHtml;
	}

	/**
	 * 入力コントローラ登録
	 * @param ZendPartialController $inputController
	 */
	protected function _addController($inputController)
	{
		$this->_inputControllers[] = $inputController;
	}

	/**
	 * 入力コントローラHTMLを返す
	 * @param string $name
	 */
	public function fetchController($name)
	{
		$result = '';
		$resultInputController = $this->_getControllerByName($name);
		/**
		 * 引数（入力コントローラ名）に該当するコントローラが
		 * 登録されていない場合、空文字を返す
		 */
		if ($resultInputController !== null) {
			$result = $resultInputController->fech();
		}
		return $result;
	}

	/**
	 * NAME属性値を返す
	 * @return string
	 */
	public function getName()
	{
		$result = '';
		$result = $this->name;
		return $result;
	}

	/**
	 * NAME属性が一致する入力コントローラオブジェクトを返す。
	 * @param string $name
	 * @return Ambigous <Hlib_Form, unknown>
	 */
	protected function _getControllerByName($name)
	{
		$result = null;

		// 全登録済み入力コントローラ対象ループ
		foreach ($this->_inputControllers as $inputController) {
			$controllerName = $inputController->getName();
			// ネーム属性一致判定
			if ($controllerName === $name) {
				$result = $inputController;
				break;
			}
		}

		return $result;
	}
}
